package activities;


import java.util.ArrayList;
import webService.AccesoWebService;
import com.androidmodule.onthego.R;
import entidades.PromocionHot;
import extras.NetInfo;
import extras.leerPreferencias;
import adaptadores.AdaptadorPromocionesHot;
import android.app.ListActivity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.TaskStackBuilder;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class ActivityPromocionesHot extends ListActivity{
	private AdaptadorPromocionesHot promocionesHot;
	private ProgressBar progresoPromocionesHot;
	protected TextView textoListaVacia;
	private boolean pausada;
	@SuppressWarnings("unchecked")
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_promociones_hot);
		promocionesHot = new AdaptadorPromocionesHot(getApplicationContext());
		progresoPromocionesHot = (ProgressBar) this.findViewById(R.id.progressBarPromocionHot);
		textoListaVacia = (TextView) this.findViewById(android.R.id.empty);
		setListAdapter(promocionesHot);
		if(savedInstanceState==null)
			if(leerPreferencias.readConexionValida(getApplicationContext()))
            buscarPromociones();		
			else{
                mostrarRedInvalida();
				textoListaVacia.setText(getString(R.string.etiqueta_red_invalida));
			}
		else
			this.cargarPromocionesHot
			((ArrayList<PromocionHot>)savedInstanceState.get("promociones"));
        //Si se desea probar utilizando el on restore que se llam adespeu sd eon start
		// y la busqueda en el onstart asi se buscan las promos cada ves que se inicie al app y no 
		// cuando se crea
	}
	
	protected void onListItemClick(ListView lista, View arg1, int position,long arg3) {
		if(NetInfo.isOnline(getApplicationContext())){
	    PromocionHot promocionAPasar = (PromocionHot)promocionesHot.getItem(position);       
        Intent intentoPromocionParticular = new Intent(this.getApplicationContext(),ActivityPromocionHot.class);
        intentoPromocionParticular.putExtra("PromocionId", Integer.parseInt(promocionAPasar.getId()));
        startActivity(intentoPromocionParticular);
        super.onListItemClick(this.getListView(), arg1, position, arg3);
		}
		else{
			Toast.makeText(getApplicationContext(), 
					getString(R.string.lista_sinConexion), Toast.LENGTH_LONG).show();
		}
	}
	
	@Override
	public void onSaveInstanceState(Bundle savedInstanceState) {
	    savedInstanceState.putParcelableArrayList("promociones", this.promocionesHot.getListaPromociones());
	    
	    // Always call the superclass so it can save the view hierarchy state
	    super.onSaveInstanceState(savedInstanceState);
	}
	public void onResume(){
		super.onResume();
		if(pausada){
			buscarPromociones();
		}
		
		
	}
	public void onPause(){
		super.onPause();
		pausada=true;
	}
	/**
	 * Recibe como parametro  un ArrayList con las promociones Hot obtenidas del servidor
	 * y las carga en la lista del adaptador
	 * @param promocionesWebService
	 * no tiene retorno
	 */
	public void cargarPromocionesHot( ArrayList<PromocionHot> promocionesWebService) {
		this.promocionesHot.limpiar();
        for(PromocionHot promocion:promocionesWebService){
            this.promocionesHot.agregarPromocionComun(promocion);
        }
        this.promocionesHot.notifyDataSetChanged();
    }

	/**
	 * Metodo que encapsula la funcionalidad asociada con la busqueda de promociones
	 */
	public void buscarPromociones(){
		if(NetInfo.isOnline(getApplicationContext())){
			progresoPromocionesHot.setVisibility(ProgressBar.VISIBLE);
			textoListaVacia.setText(R.string.lista_buscandoPromociones);			
		    hiloPromocionesComunes hilo = new hiloPromocionesComunes();
		    hilo.execute();
		}
		else{
			Toast.makeText(getApplicationContext(),getString(R.string.mensaje_sinConexion),
			        Toast.LENGTH_LONG).show();
			textoListaVacia.setText(getString(R.string.lista_sinConexion));
		}
	}
	
	/**
	 * Clase interna, es el hilo que busca las promociones comunes en el servidor
	 * @author Marco
	 *
	 */
	public class hiloPromocionesComunes extends AsyncTask<Void, Integer, ArrayList<PromocionHot>> {
        String mensajeError ="";
        ArrayList<PromocionHot> promocionesWebService;
        
        public hiloPromocionesComunes(){
            promocionesWebService = new ArrayList<PromocionHot>();
        }

        @Override
        protected ArrayList<PromocionHot> doInBackground(Void... params) { 
            try{
    	        AccesoWebService accesoWeb = new AccesoWebService();
    	        NetInfo netInfo = new NetInfo(getApplicationContext());
    	        String tipoPago = leerPreferencias.readTipoPago
    	        		(getApplicationContext(), leerPreferencias.TIPO_DE_PAGO_PROMOCION_HOT);
    	        String categorias = leerPreferencias.readCategoria
    	        		(getApplicationContext(), leerPreferencias.CATEGORIA_PROMOCION_HOT);
    	        promocionesWebService = accesoWeb.getPromocionesHotPorFiltro(netInfo.getBSSID(),tipoPago,categorias);
            }
            catch (java.net.SocketTimeoutException timeOut){
           	    mensajeError =  getString(R.string.mensaje_sinAccesoServidor);
            }
            catch(Exception e){
            	e.printStackTrace();
            	mensajeError="erro";
            }
            return promocionesWebService;
        }

        protected void onProgressUpdate(Integer... values){}
        
        protected void onPostExecute(ArrayList<PromocionHot> promociones){
            if(!"".equals(mensajeError)){
        	    /*Toast.makeText(getApplicationContext(),getString
        	            (R.string.mensaje_sinAccesoServidor), Toast.LENGTH_LONG).show();
        	    textoListaVacia.setText(getString(R.string.mensaje_sinAccesoServidor));
        	    */
            	mostrarError();
            }    
            else{
               if(promociones.size()>0)
                     cargarPromocionesHot(promociones);
          	   else{
          		   textoListaVacia.setText(getString(R.string.lista_sinPromocionesComunes));
          		   mostrarListaVacia();
          	   }
            }
            progresoPromocionesHot.setVisibility(ProgressBar.GONE);
        }
	}
	
	public void mostrarListaVacia(){
		Intent intent = new Intent(getApplicationContext(),ActivityDisplay.class);
		intent.putExtra(ActivityDisplay.TIPO_DISPLAY, ActivityDisplay.LISTA_PROMOCIONES_VACIA);
		startActivities( TaskStackBuilder.create(getApplicationContext())
        // add all of DetailsActivity's parents to the stack,
        // followed by DetailsActivity itself
        .addNextIntentWithParentStack(intent)
        .getIntents());

	}
	
	public void mostrarError(){
		Intent intent = new Intent(getApplicationContext(),ActivityDisplay.class);
		intent.putExtra(ActivityDisplay.TIPO_DISPLAY, ActivityDisplay.ERROR_CONEXION);
		startActivities( TaskStackBuilder.create(getApplicationContext())
        // add all of DetailsActivity's parents to the stack,
        // followed by DetailsActivity itself
        .addNextIntentWithParentStack(intent)
        .getIntents());
		
	}
	
	public void mostrarRedInvalida(){
		Intent intent = new Intent(getApplicationContext(),ActivityDisplay.class);
		intent.putExtra(ActivityDisplay.TIPO_DISPLAY, ActivityDisplay.RED_NO_VALIDA);
		startActivities( TaskStackBuilder.create(getApplicationContext())
        // add all of DetailsActivity's parents to the stack,
        // followed by DetailsActivity itself
        .addNextIntentWithParentStack(intent)
        .getIntents());
		
	}

}
